/*
 ============================================================================
 Name        : prog-pegasus.c
 Author      : Francisco Oliveira
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <gtk/gtk.h>
#include <glib/gprintf.h>
#include <stdlib.h>
#include <glade/glade.h>
#include "jogo.h"
#include <string.h>

	GtkWidget *frmPincipal;
	GtkWidget *frmSobre;
	GtkWidget *frmSelMarcador;
	GtkWidget *frmResultado;
	GtkWidget *frmVisualizador;


	GtkWidget *button1;
	GtkWidget *button2;
	GtkWidget *button3;
	GtkWidget *button4;
	GtkWidget *button5;
	GtkWidget *button6;
	GtkWidget *button7;
	GtkWidget *button8;
	GtkWidget *button9;
	GtkWidget *status_bar;
	GtkWidget *lblResultado;
	GtkWidget *btnYesResult;
	GtkWidget *btnNoResult;
	GtkWidget *messagedialog1;
	GtkWidget *textview1;



	typedef struct {
		char velha[3][3];
		char jogador1;		// marcador do jogador 1
		char jogador2;		// marcador do computador
		int  cont;			// Vitoria(s) do jogador 1
		int  round;			// Partida(s) disputadas
		int  vez;
	}TJogo;

	TJogo jogo;
	char status[100];


void dialogShow(GtkWidget *window){
	gtk_dialog_run(GTK_DIALOG(window));
	gtk_widget_hide(window);
}

void changeStatusBar(GtkWidget *status_bar, char msg[10]){
	gtk_statusbar_push( GTK_STATUSBAR(status_bar), GPOINTER_TO_INT(1), msg);
}


void clearButton(GtkWidget *button){
	gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file(NULL));
}

void onSave(GtkWidget *sender){
	save(3,jogo.velha);

	dialogShow(messagedialog1);
	changeStatusBar(status_bar,"Jogo salvo com sucesso.");
}

void onOpenFile(char *nomearq)
{
//	GtkWidget *view;
//	GtkTextBuffer *buffer;

	//view = gtk_text_view_new ();

//	textview1 = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));


	FILE *arquivo;
	arquivo=fopen(nomearq,"r");
	if(arquivo!=NULL)
		{
		char str[100];
		int cnt=0;
		while(fscanf(arquivo,"%s",str)==1)
			{
			    if(cnt%3==0)

			    //gtk_text_buffer_set_text (buffer, str, -1);

			cnt++;
			}

			fclose(arquivo);

			gtk_widget_show_all(frmVisualizador);

	}
}

void onNewGame(GtkWidget *sender){

	// zera matriz
	zerar(3,jogo.velha);
	jogo.vez=1;
	jogo.round+=1;


	////////

	clearButton(button1);
	clearButton(button2);
	clearButton(button3);
	clearButton(button4);
	clearButton(button5);
	clearButton(button6);
	clearButton(button7);
	clearButton(button8);
	clearButton(button9);

	 g_snprintf(status, 100, "Sua vez - Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);

}

// verifica qual opcao de marcador o usuario selecionou
void onBtnSelMarClick(GtkWidget *button){

	if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(button))){
		jogo.jogador1='X';
		jogo.jogador2='0';
	}else{
		jogo.jogador1='0';
		jogo.jogador2='X';
	}

}

void exibirJogadaPC(int x, int y){

	if (x==0 && y==0){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button1),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button1);
		}else{
			gtk_button_set_image(GTK_BUTTON(button1),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button1);
		}
	}else if (x==0 && y==1){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button2),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button2);
		}else{
			gtk_button_set_image(GTK_BUTTON(button2),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button2);
		}
	}else if (x==0 && y==2){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button3),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button3);
		}else{
			gtk_button_set_image(GTK_BUTTON(button3),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button3);
		}
	}else if (x==1 && y==0){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button4),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button4);
		}else{
			gtk_button_set_image(GTK_BUTTON(button4),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button4);
		}
	}else if (x==1 && y==1){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button5),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button5);
		}else{
			gtk_button_set_image(GTK_BUTTON(button5),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button5);
		}
	}else if (x==1 && y==2){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button6),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button6);
		}else{
			gtk_button_set_image(GTK_BUTTON(button6),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button6);
		}
	}else if (x==2 && y==0){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button7),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button7);
		}else{
			gtk_button_set_image(GTK_BUTTON(button7),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button7);
		}
	}else if (x==2 && y==1){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button8),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button8);
		}else{
			gtk_button_set_image(GTK_BUTTON(button8),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button8);
		}
	}else if (x==2 && y==2){

		if (jogo.jogador2=='0'){
			gtk_button_set_image(GTK_BUTTON(button9),gtk_image_new_from_file("./img/0.64.png"));
			gtk_widget_show(button9);
		}else{
			gtk_button_set_image(GTK_BUTTON(button9),gtk_image_new_from_file("./img/X.64.png"));
			gtk_widget_show(button9);
		}
	}


}

void computer_move(){

	int i, j;

    for (i = 0; i < 3; i++)
    {
        for (j = 0; j <3; j++)
            if (jogo.velha[i][j] == '-') break;

        if (jogo.velha[i][j] == '-') break;

    }

    jogo.velha[i][j]=jogo.jogador2;
    exibirJogadaPC(i,j);

    if (vitoria(3,jogo.velha)){
    	gtk_label_set_text(GTK_LABEL(lblResultado),"Você perdeu, quer jogar novamente?");
    	dialogShow(frmResultado);
    }else if (!full(3,jogo.velha)) {
    	gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
    	dialogShow(frmResultado);
    }

    g_snprintf(status, 100, "Sua vez - Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
    changeStatusBar(status_bar ,status);


}


void onButton1Click(GtkWidget *button){
	int x=0,y=0;

		if (jogo.velha[x][y]=='-'){
			jogo.velha[x][y]=jogo.jogador1;
			if (jogo.jogador1=='0'){
				gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
				gtk_widget_show(button);
			}else{
				gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
				gtk_widget_show(button);
			}
			if (vitoria(3,jogo.velha)){
				gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");
				dialogShow(frmResultado);
			}else if (!full(3,jogo.velha)) {
				gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
				dialogShow(frmResultado);
			}else{
				computer_move();
			}
		}

		g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
		changeStatusBar(status_bar ,status);

}

void onButton2Click(GtkWidget *button){
	int x=0,y=1;

		if (jogo.velha[x][y]=='-'){
			jogo.velha[x][y]=jogo.jogador1;
			if (jogo.jogador1=='0'){
				gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
				gtk_widget_show(button);
			}else{
				gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
				gtk_widget_show(button);
			}
			if (vitoria(3,jogo.velha)){
				gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");

				dialogShow(frmResultado);
			}else if (!full(3,jogo.velha)) {
				gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
				dialogShow(frmResultado);
			}else{
				computer_move();
			}
		}

		g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
		changeStatusBar(status_bar ,status);

}

void onButton3Click(GtkWidget *button){
	int x=0, y=2;

		if (jogo.velha[x][y]=='-'){
			jogo.velha[x][y]=jogo.jogador1;

			if (jogo.jogador1=='0'){
				gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
				gtk_widget_show(button);
			}else{
				gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
				gtk_widget_show(button);
			}

			if (vitoria(3,jogo.velha)){
				gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");
				dialogShow(frmResultado);
			}else if (!full(3,jogo.velha)) {
				gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
				dialogShow(frmResultado);
			}else{
				computer_move();
			}
		}

		g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
		changeStatusBar(status_bar ,status);

}
void onButton4Click(GtkWidget *button){
	int x=1, y=0;

			if (jogo.velha[x][y]=='-'){
				jogo.velha[x][y]=jogo.jogador1;
				if (jogo.jogador1=='0'){
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
					gtk_widget_show(button);
				}else{
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
					gtk_widget_show(button);
				}

				if (vitoria(3,jogo.velha)){
					gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");
					dialogShow(frmResultado);
				}else if (!full(3,jogo.velha)) {
					gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
					dialogShow(frmResultado);
				}else{
					computer_move();
				}
			}

			g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
			changeStatusBar(status_bar ,status);
}
void onButton5Click(GtkWidget *button){
	int x=1;
	int y=1;

			if (jogo.velha[x][y]=='-'){
				jogo.velha[x][y]=jogo.jogador1;

				if (jogo.jogador1=='0'){
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
					gtk_widget_show(button);
				}else{
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
					gtk_widget_show(button);
				}

				if (vitoria(3,jogo.velha)){
					gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");
					dialogShow(frmResultado);
				}else if (!full(3,jogo.velha)) {
					gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
					dialogShow(frmResultado);
				}else{
					computer_move();
				}
			}
			g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
			changeStatusBar(status_bar ,status);

}
void onButton6Click(GtkWidget *button){
	int x=1;
	int y=2;

			if (jogo.velha[x][y]=='-'){
				jogo.velha[x][y]=jogo.jogador1;

				if (jogo.jogador1=='0'){
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
					gtk_widget_show(button);
				}else{
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
					gtk_widget_show(button);
				}

				if (vitoria(3,jogo.velha)){
					gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");
					dialogShow(frmResultado);
				}else if (!full(3,jogo.velha)) {
					gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
					dialogShow(frmResultado);
				}else{
					computer_move();
				}
			}


			g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
			changeStatusBar(status_bar ,status);
}

void onButton7Click(GtkWidget *button){
	int x=2;
	int y=0;

			if (jogo.velha[x][y]=='-'){
				jogo.velha[x][y]=jogo.jogador1;

				if (jogo.jogador1=='0'){
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
					gtk_widget_show(button);
				}else{
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
					gtk_widget_show(button);
				}

				if (vitoria(3,jogo.velha)){
					gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");
					dialogShow(frmResultado);
				}else if (!full(3,jogo.velha)) {
					gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
					dialogShow(frmResultado);
				}else{
					computer_move();
				}
			}
			g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
			changeStatusBar(status_bar ,status);
}

void onButton8Click(GtkWidget *button){
	int x=2;
	int y=1;

			if (jogo.velha[x][y]=='-'){
				jogo.velha[x][y]=jogo.jogador1;

				if (jogo.jogador1=='0'){
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
					gtk_widget_show(button);
				}else{
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
					gtk_widget_show(button);
				}

				if (vitoria(3,jogo.velha)){
					gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");
					dialogShow(frmResultado);
				}else if (!full(3,jogo.velha)) {
					gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
					dialogShow(frmResultado);
				}else{
					computer_move();
				}
			}
			g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
			changeStatusBar(status_bar ,status);
}

void onButton9Click(GtkWidget *button){
	int x=2;
	int y=2;

			if (jogo.velha[x][y]=='-'){
				jogo.velha[x][y]=jogo.jogador1;

				if (jogo.jogador1=='0'){
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/0.64.png"));
					gtk_widget_show(button);
				}else{
					gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_file("./img/X.64.png"));
					gtk_widget_show(button);
				}

				if (vitoria(3,jogo.velha)){
					gtk_label_set_text(GTK_LABEL(lblResultado),"Você venceu, quer jogar novamente?");
					dialogShow(frmResultado);
				}else if (!full(3,jogo.velha)) {
					gtk_label_set_text(GTK_LABEL(lblResultado),"Empate, quer jogar novamente?");
					dialogShow(frmResultado);
				}else{
					computer_move();
				}
			}
			g_snprintf(status, 100, "Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
			changeStatusBar(status_bar ,status);

}




void onLinkClicked(GtkWidget *widget){
	const gchar *link= gtk_link_button_get_uri(GTK_LINK_BUTTON(widget));
	gchar *navegador = g_strconcat("htmlview ",link,NULL);
	system(navegador);
	g_slice_free(gchar,navegador);
}

int main (int argc, char *argv[])
{
  GladeXML *xml;
  gtk_init(&argc,&argv);

  xml = glade_xml_new("JogoDaVelha.glade",NULL,NULL);

  // Janelas do aplicativo
  frmPincipal = glade_xml_get_widget(xml,"frmPincipal");
  frmSobre = glade_xml_get_widget(xml,"frmSobre");
  frmSelMarcador = glade_xml_get_widget(xml,"frmSelMarcador");
  frmResultado = glade_xml_get_widget(xml,"frmResultado");
  messagedialog1 = glade_xml_get_widget(xml,"messagedialog1");
  frmVisualizador = glade_xml_get_widget(xml,"frmVisualizador");



  // criando o botoes da janela principal
  button1 = glade_xml_get_widget(xml,"button1");
  button2 = glade_xml_get_widget(xml,"button2");
  button3 = glade_xml_get_widget(xml,"button3");
  button4 = glade_xml_get_widget(xml,"button4");
  button5 = glade_xml_get_widget(xml,"button5");
  button6 = glade_xml_get_widget(xml,"button6");
  button7 = glade_xml_get_widget(xml,"button7");
  button8 = glade_xml_get_widget(xml,"button8");
  button9 = glade_xml_get_widget(xml,"button9");
  textview1 = glade_xml_get_widget(xml,"textview1");

  // barra de status do formulario principal
  status_bar = glade_xml_get_widget(xml,"statusbar1");

  //formulario resultado
  btnYesResult = glade_xml_get_widget(xml,"btnYesResult");
  btnNoResult = glade_xml_get_widget(xml,"btnnoResult");
  lblResultado = glade_xml_get_widget(xml,"lblResultado");


  glade_xml_signal_autoconnect(xml);

  // exibe toda interface
  gtk_widget_show_all(frmPincipal);

  dialogShow(frmSelMarcador);


  //inicializando o tipo jogo
  jogo.vez=1;		// vez do jogador 1
  jogo.round=1;
  jogo.cont=0;

  zerar(3,jogo.velha);

  g_snprintf(status, 100, "Sua vez - Partida(s) = %d Vitoria(s) = %d", jogo.round,jogo.cont);
  changeStatusBar(status_bar ,status);

  gtk_main();



  return 0;

}
